原始题目:剑指 Offer 04. 二维数组中的查找 (opens new window)

解题思路:

因为题目中说明了每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。因此对于数组中的某个数字 aa ,如果 targettargetaa 小,说明 targettargetaa 上方。如果 targettargetaa 搭,说明 targettargetaa 的右方。

为了方便描述,将一个二维数组的四条边分为上下左右四个方向。

算法流程:

  1. 从二维数组 matrixmatrix 的左下方开始遍历,索引设置为 (i,j)(i, j),并与目标值 targettarget 比较大小。
    1. 如果 matrix[i][j]matrix[i][j] 等于 targettarget,那么直接返回 truetrue
    2. 如果 matrix[i][j]matrix[i][j] 大于 targettarget,说明 targettargetmatrix[i][j]matrix[i][j] 的上方,那么 ii--
    3. 如果 matrix[i][j]matrix[i][j] 小于 targettarget,说明 targettargetmatrix[i][j]matrix[i][j] 的右方,那么 j++j++
  2. 如果遍历完之后,没有返回,则找不到 targettarget,返回 falsefalse

代码:

public boolean findNumberIn2DArray(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0) {
        return false;
    }
    int i = matrix.length - 1;
    int j = 0;
    while (i >= 0 && j < matrix[0].length) {
        if (matrix[i][j] == target) {
            return true;
        }
        if (matrix[i][j] > target) {
            i--;
        } else {
            j++;
        }
    }
    return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

复杂度分析

  • 时间复杂度O(M+N)O(M+N):其中,MMNN 是矩阵的行数和列数,此算法最多循环 M+NM + N 次。

  • 空间复杂度O(1)O(1):使用常数级的空间。

上次更新: 2023/10/15